#include <algorithm>
#include <iostream>
#include <memory>
#include <thread>
#include <semaphore.h>
#include <time.h>
using namespace std;
#include<bits/stdc++.h>


class Foo {
private:
    int flag;
public:

    Foo() {
        this->flag=0;
    }

    void first() {
        // printFirst() outputs "first".
        while(true){
            if(this->flag==0){
                std::cout << "first";
                ++flag;
                break;
            }
        }

    }

    void second() {
        // printSecond() outputs "second".
        while(true){
            if(this->flag==1){
                std::cout << "second";
                ++flag;
                break;
            }
        }
    }

    void third() {
        // printThird() outputs "third".
        while(true){
            if(this->flag==2){
                std::cout << "third";
                flag=0;
                break;
            }
        }
    }
};

int main(int argc, char** argv) {
    int array[3] = {1, 3, 2};
    int a,b,c;
    string str;
    while(getline(std::cin,str)){
        str = str.substr(1,str.size()-2);
        int pos=0;
        for(int i=0;i<str.size();++i){
            if(str[i]<='3' && str[i]>='1'){
                array[pos] = str[i]-'0';
                ++pos;
            }
        }
        ::srand((unsigned)time(NULL));
        std::random_shuffle(array, array + 3);

        std::thread th1, th2, th3;
        std::unique_ptr<Foo> foo(new Foo());
        for (int i : array) {
            switch(i) {
            case 1:
                th1 = std::thread(&Foo::first, foo.get());
                break;
            case 2:
                th2 = std::thread(&Foo::second, foo.get());
                break;
            case 3:
                th3 = std::thread(&Foo::third, foo.get());
                break;
            default:
                break;
            }
        }
        th1.join();
        th2.join();
        th3.join();

        std::cout << std::endl;
    }
    return 0;
}


/* 按指定顺序打印
时间限制： 1000MS
内存限制： 524288KB
题目描述：
我们提供了一个类：

public class FooPrint {  public void first() { print("first"); }  public void second() { print("second"); }  public void third() { print("third"); }}
三个不同的线程 A、B、C 将会共用一个 FooPrint 实例。

一个将会调用 first() 方法

一个将会调用 second() 方法

还有一个将会调用 third() 方法

请设计修改程序，以确保 second() 方法在 first() 方法之后被执行，third() 方法在 second() 方法之后被执行。



输入描述
整数数组。数组每个元素值表示对应线程调用的方法，对应关系：1-first(), 2-second(), 3-third()。如：

输入 [1,3,2] 表示线程 A 将会调用 first() 方法，线程 B 将会调用 third() 方法，线程 C 将会调用 second() 方法。

输出描述
按序输出firstsecondthird


样例输入
[1,3,2]
样例输出
firstsecondthird */